package core

import (
	"path/filepath"
	"strings"
)

// FileFilter 文件过滤器
type FileFilter struct {
	// 排除的目录名称
	ExcludeDirs []string `json:"exclude_dirs"`
	// 排除的文件名称
	ExcludeFiles []string `json:"exclude_files"`
	// 排除的文件扩展名
	ExcludeExts []string `json:"exclude_exts"`
	// 排除以特定前缀开头的文件/目录
	ExcludePrefixes []string `json:"exclude_prefixes"`
}

// NewFileFilter 创建默认的文件过滤器
func NewFileFilter() *FileFilter {
	return &FileFilter{
		ExcludeDirs: []string{
			// Python
			".venv",
			"venv",
			"env",
			"__pycache__",
			".pytest_cache",
			".mypy_cache",
			".tox",
			"site-packages",
			".eggs",
			"*.egg-info",

			// Node.js
			"node_modules",
			".npm",
			".yarn",
			".pnp",
			"bower_components",

			// 编译输出
			"build",
			"dist",
			"out",
			"target",
			"bin",

			// IDE和编辑器
			".idea",
			".vscode",
			".vs",
			".atom",
			".sublime",

			// 版本控制
			".git",
			".svn",
			".hg",
			".bzr",

			// 其他
			".cache",
			".temp",
			".tmp",
			"tmp",
			"temp",
			"logs",
			".log",

			// macOS
			".Trash",

			// Windows
			"$RECYCLE.BIN",

			// 特定工具
			".claude",
			".codebuddy",
			".playwright-mcp",
			".specify",
			".next",
			".nuxt",
			".docusaurus",
		},
		ExcludeFiles: []string{
			// macOS
			".DS_Store",
			".localized",
			".AppleDouble",
			".LSOverride",

			// Windows
			"Thumbs.db",
			"desktop.ini",

			// Python
			"*.pyc",
			"*.pyo",
			"*.pyd",
			".Python",

			// 日志
			"*.log",

			// 临时文件
			"*.tmp",
			"*.temp",
			"*.swp",
			"*.swo",
			"*~",

			// 配置文件(可选,根据需要调整)
			// ".env",
			// ".env.local",
		},
		ExcludePrefixes: []string{
			".",  // 隐藏文件(以点开头)
			"~",  // 备份文件
		},
	}
}

// ShouldExclude 判断文件或目录是否应该被排除
func (f *FileFilter) ShouldExclude(path string, isDir bool) bool {
	name := filepath.Base(path)

	// 检查前缀排除
	for _, prefix := range f.ExcludePrefixes {
		if strings.HasPrefix(name, prefix) {
			return true
		}
	}

	// 如果是目录,检查目录排除列表
	if isDir {
		for _, excludeDir := range f.ExcludeDirs {
			if name == excludeDir || strings.Contains(name, excludeDir) {
				return true
			}
		}
	}

	// 检查文件排除列表
	for _, excludeFile := range f.ExcludeFiles {
		// 支持通配符匹配
		if strings.Contains(excludeFile, "*") {
			ext := filepath.Ext(name)
			pattern := strings.TrimPrefix(excludeFile, "*")
			if ext == pattern {
				return true
			}
		} else {
			if name == excludeFile {
				return true
			}
		}
	}

	return false
}

// AddExcludeDir 添加要排除的目录
func (f *FileFilter) AddExcludeDir(dir string) {
	f.ExcludeDirs = append(f.ExcludeDirs, dir)
}

// AddExcludeFile 添加要排除的文件
func (f *FileFilter) AddExcludeFile(file string) {
	f.ExcludeFiles = append(f.ExcludeFiles, file)
}

// AddExcludeExt 添加要排除的扩展名
func (f *FileFilter) AddExcludeExt(ext string) {
	if !strings.HasPrefix(ext, ".") {
		ext = "." + ext
	}
	f.ExcludeExts = append(f.ExcludeExts, ext)
}

// ClearExcludes 清除所有排除规则
func (f *FileFilter) ClearExcludes() {
	f.ExcludeDirs = []string{}
	f.ExcludeFiles = []string{}
	f.ExcludeExts = []string{}
	f.ExcludePrefixes = []string{}
}
